package com.arpgalaxy.generator.utils;

import java.lang.reflect.Field;
import java.util.*;

/**
 * @Author Arpgalaxy
 * @Date 2022/11/14 0:39
 * @Description:
 * @Version 1.0
 */
public class BeanUtils {
    public static <K, V> Map<K, V> beanToHashMap(Object source) {
        Map<K, V> target = new HashMap<>();
        Class<?> clazz = source.getClass();
        List<Field> allFields = new ArrayList<>(100);
        // 获取当前对象的所有属性字段
        // clazz.getFields()：获取public修饰的字段
        // clazz.getDeclaredFields()： 获取所有的字段包括private修饰的字段
        allFields.addAll(Arrays.asList(clazz.getDeclaredFields()));

        // 获取所有父类的字段， 父类中的字段需要逐级获取
        Class clazzSuper = clazz.getSuperclass();

        // 如果父类不是object，表明其继承的有其他类。 逐级获取所有父类的字段
        while (clazzSuper != Object.class) {
            allFields.addAll(Arrays.asList(clazzSuper.getDeclaredFields()));
            clazzSuper = clazzSuper.getSuperclass();
        }
        allFields.stream().forEach(field -> {
            field.setAccessible(true);
            try {
                target.put((K) field.getName(), (V) field.get(source));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        });
        return target;
    }
}
